home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / m2posx10.zoo / m2posix.10 / test / listdir.mpp < prev    next >
Encoding:
Text File  |  1993-10-12  |  6.3 KB  |  260 lines

  1. MODULE ListDir;
  2. __IMP_SWITCHES__
  3. #ifdef HM2
  4. #ifdef __LONG_WHOLE__
  5. (*$!i+: Modul muss mit $i- uebersetzt werden! *)
  6. (*$!w+: Modul muss mit $w- uebersetzt werden! *)
  7. #else
  8. (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
  9. (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
  10. #endif
  11. #endif
  12. (* Test und Anwendungsbeispiel fuer die Verzeichnisprozeduren
  13.  *
  14.  * Benutzung: listdir [ Muster [ Verzeichnis ... ]]
  15.  *
  16.  * Vorsicht beim Aufruf in einer Kommandoshell: Das Muster muss hier
  17.  * ``gequoted'' werden!
  18.  * Bei der Angabe des Musters ist zu beachten, dass zwischen Gross- und
  19.  * Kleinschreibung unterschieden wird.
  20.  *
  21.  * hk, 02-Okt-93
  22.  *)
  23.  
  24.  
  25. VAL_INTRINSIC
  26. CAST_IMPORT
  27. PTR_ARITH_IMPORT
  28.  
  29. FROM SYSTEM IMPORT
  30. (* TYPE *) ADDRESS,
  31. (* PROC *) ADR;
  32.  
  33. FROM PORTAB IMPORT
  34. (* CONST*) NULL,
  35. (* TYPE *) WORDSET, SIGNEDWORD, UNSIGNEDWORD, UNSIGNEDLONG;
  36.  
  37. IMPORT e;
  38.  
  39. FROM types IMPORT
  40. (* CONST*) PATHMAX,
  41. (* TYPE *) FileName, PathName, StrPtr;
  42.  
  43. FROM file IMPORT
  44. (* TYPE *) FileModes, modeT, StatRec,
  45. (* PROC *) lstat, sISCHR, sISDIR, sISBLK, sISREG, sISFIFO, sISLNK;
  46.  
  47. FROM dir IMPORT
  48. (* TYPE *) DIR, DirentPtr, DirentRec,
  49. (* PROC *) opendir, readdir, rewinddir, closedir, chdir, getcwd;
  50.  
  51. FROM cmdline IMPORT
  52. (* PROC *) ArgCount, GetArg;
  53.  
  54. FROM cstr IMPORT
  55. (* PROC *) AssignCToM2, strerror;
  56.  
  57. FROM pSTRING IMPORT
  58. (* PROC *) COMPARE;
  59.  
  60. FROM POSIX2 IMPORT
  61. (* TYPE *) FNMFlags,
  62. (* PROC *) fnmatch;
  63.  
  64. FROM lib IMPORT
  65. (* PROC *) qsort;
  66.  
  67. FROM InOut IMPORT
  68. (* PROC *) Read, Write, WriteString, WriteLn, WriteCard;
  69.  
  70. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  71.  
  72. CONST
  73.   MAXCOUNT = 255;
  74.  
  75. VAR
  76.   HOME  : PathName;
  77.   list  : ARRAY [0..MAXCOUNT] OF FileName;
  78.  
  79. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  80. #if (defined HM2) || (defined HM2_OLD)
  81. (*$E+ Prozedur als Parameter erlaubt *)
  82. #endif
  83. PROCEDURE CompStr ((* EIN/ -- *) cmp1 : ADDRESS;
  84.                    (* EIN/ -- *) cmp2 : ADDRESS ): INTEGER;
  85.  
  86. VAR p1, p2 : POINTER TO FileName;
  87.  
  88. BEGIN
  89.  p1 := cmp1;
  90.  p2 := cmp2;
  91.  RETURN(COMPARE(p1^, p2^));
  92. END CompStr;
  93. #if (defined HM2) || (defined HM2_OLD)
  94. (*$E=*)
  95. #endif
  96.  
  97. (*---------------------------------------------------------------------------*)
  98.  
  99. PROCEDURE DoList ((* EIN/ -- *) dir     : PathName;
  100.                   (* EIN/ -- *) pattern : ARRAY OF CHAR );
  101.  
  102. VAR void    : INTEGER;
  103.     dirp    : DIR;
  104.     dp      : DirentPtr;
  105.     count, i: SIGNEDWORD;
  106.     errstr  : ARRAY [0..40] OF CHAR;
  107.     attr    : ARRAY [0..10] OF CHAR;
  108.     st      : StatRec;
  109.     t       : CHAR;
  110.     total   : CARDINAL;
  111.     kB      : CARDINAL;
  112.     file    : FileName;
  113.  
  114. BEGIN
  115.   WriteString("Dateimuster: "); WriteString(pattern); WriteLn;
  116.   WriteString("Verzeichnis: "); WriteString(dir); WriteLn;
  117.  
  118.   dirp := opendir(dir);
  119.   IF dirp = NULL THEN
  120.     strerror(e.errno, errstr);
  121.     WriteString("opendir: "); WriteString(errstr); WriteLn;
  122.     RETURN;
  123.   END;
  124.  
  125.   count := 0;
  126.   dp    := readdir(dirp);
  127.   WHILE dp <> NULL DO
  128.     AssignCToM2(dp^.dName, file);
  129.     IF fnmatch(file, pattern, FNMFlags{}) = 0 THEN
  130.       IF count < MAXCOUNT THEN
  131.         list[count] := file;
  132.         INC(count);
  133.       ELSE
  134.         void := closedir(dirp);
  135.         void := chdir(HOME);
  136.         WriteString("DoList: tab overflow"); WriteLn;
  137.         RETURN;
  138.       END;
  139.     END; (* IF fnmatch() *)
  140.     dp := readdir(dirp);
  141.   END;
  142.   void := closedir(dirp);
  143.  
  144.   qsort(ADR(list),
  145.         VAL(UNSIGNEDLONG,count),
  146.         VAL(UNSIGNEDLONG,ABS(DIFADR(ADR(list[1]), ADR(list[0])))),
  147.         CompStr);
  148.  
  149.   void  := chdir(dir); (* damit "lstat()" die Dateien findet *)
  150.   total := 0;
  151.   FOR i := 0 TO count - 1 DO
  152.     IF lstat(list[i], st) < 0 THEN
  153.       strerror(e.errno, errstr);
  154.       WriteString("lstat: "); WriteString(list[i]); WriteString(": ");
  155.       WriteString(errstr); WriteLn;
  156.     ELSE
  157.       WITH st DO
  158.         attr := "----------";
  159.         t    := ' ';
  160.  
  161.         IF sISREG(stMode) THEN
  162.           IF sIXUSR IN stMode THEN
  163.             t := '*';
  164.           END;
  165.         ELSIF sISDIR(stMode) THEN
  166.           attr[0] := 'd'; t := '/';
  167.         ELSIF sISCHR(stMode) THEN
  168.           attr[0] := 'c';
  169.         ELSIF sISLNK(stMode) THEN
  170.           attr[0] := 'l'; t := '@';
  171.         ELSIF sISFIFO(stMode) THEN
  172.           attr[0] := 'p'; t := '|';
  173.         ELSIF sISBLK(stMode) THEN
  174.           attr[0] := 'b';
  175.         ELSE
  176.           attr[0] := '?';
  177.         END;
  178.  
  179.         IF sIRUSR IN stMode THEN
  180.           attr[1] := 'r';
  181.         END;
  182.         IF sIRGRP IN stMode THEN
  183.           attr[4] := 'r';
  184.         END;
  185.         IF sIROTH IN stMode THEN
  186.           attr[7] := 'r';
  187.         END;
  188.         IF sIWUSR IN stMode THEN
  189.           attr[2] := 'w';
  190.         END;
  191.         IF sIWGRP IN stMode THEN
  192.           attr[5] := 'w';
  193.         END;
  194.         IF sIWOTH IN stMode THEN
  195.           attr[8] := 'w';
  196.         END;
  197.         IF sIXUSR IN stMode THEN
  198.           attr[3] := 'x';
  199.         END;
  200.         IF sIXGRP IN stMode THEN
  201.           attr[6] := 'x';
  202.         END;
  203.         IF sIXOTH IN stMode THEN
  204.           attr[9] := 'x';
  205.         END;
  206.         WriteCard(VAL(CARDINAL,stIno), 4);
  207.         kB := VAL(CARDINAL,(VAL(UNSIGNEDLONG,stSize) + LC(1023)) DIV LC(1024));
  208.         WriteCard(kB, 5);
  209.         Write(' ');
  210.         WriteString(attr);
  211.         WriteCard(VAL(CARDINAL,stNlink), 3);
  212.         Write(' ');
  213.         WriteString(list[i]); Write(t);
  214.         WriteLn;
  215.         INC(total, kB);
  216.       END; (* WITH *)
  217.     END; (* IF lstat *)
  218.   END; (* FOR *)
  219.   WriteString("-----------------------"); WriteLn;
  220.   WriteCard(total, 9); WriteString("kB total"); WriteLn;
  221.   void := chdir(HOME);
  222. END DoList;
  223.  
  224. (*===========================================================================*)
  225.  
  226. VAR
  227.   voidp : StrPtr;
  228.   i     : INTEGER;
  229.   ch    : CHAR;
  230.   argc  : INTEGER;
  231.   DIRS  : PathName;
  232.   PAT   : PathName;
  233.  
  234. BEGIN
  235.   voidp := getcwd(CAST(StrPtr,ADR(HOME)), PATHMAX+1);
  236.   WriteString("akt. Verzeichnis: ");
  237.   WriteString(HOME);
  238.   WriteLn;
  239.   WriteLn;
  240.  
  241.   DIRS := ".";
  242.   PAT  := "*";
  243.  
  244.   argc := ArgCount();
  245.   IF argc <= 1 THEN
  246.     DoList(DIRS, PAT);
  247.   ELSIF argc <= 2 THEN
  248.     GetArg(1, PAT);
  249.     DoList(DIRS, PAT);
  250.   ELSE
  251.     GetArg(1, PAT);
  252.     FOR i := 2 TO argc - 1 DO
  253.       GetArg(i, DIRS);
  254.       DoList(DIRS, PAT);
  255.       WriteLn;
  256.     END;
  257.   END;
  258.   Read(ch);
  259. END ListDir.
  260.